package src.CodeTop;

/**
 * 给你一个整数数组 nums，请你选择数组的两个不同下标 i 和 j，使 (nums[i]-1)*(nums[j]-1) 取得最大值。
 *
 * 请你计算并返回该式的最大值。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：nums = [3,4,5,2]
 * 输出：12
 * 解释：如果选择下标 i=1 和 j=2（下标从 0 开始），则可以获得最大值，(nums[1]-1)*(nums[2]-1) = (4-1)*(5-1) = 3*4 = 12 。
 * 示例 2：
 *
 * 输入：nums = [1,5,4,5]
 * 输出：16
 * 解释：选择下标 i=1 和 j=3（下标从 0 开始），则可以获得最大值 (5-1)*(5-1) = 16 。
 * 示例 3：
 *
 * 输入：nums = [3,7]
 * 输出：12
 *
 */

public class _1464MaximumProductOfTwoElementsInAnArray {
    public static void main(String[] args) {
        int[] nums = {3, 4, 5, 2};
        int target = maxProduct(nums);
        System.out.println(target);
    }

    public static int maxProduct(int[] nums) {
        // 校验合法性
        if (nums == null) {
            return 0;
        }else if (nums.length == 1) {
            return nums[0];
        }else if (nums.length == 2) {
            return (nums[0] - 1) * (nums[1] - 1);
        }else {
            // 定义最大值和次大值
            int firstMax = 0, secondMax = 0;
            // 遍历原数组
            for (int i = 0 ; i < nums.length ; i++) {
                // 若当前元素大于最大值，则num为最大值，先前的firstMax为次大值
                if (nums[i] > firstMax) {
                    secondMax = firstMax;
                    firstMax = nums[i];
                }else if (nums[i] > secondMax) {
                    // 上一层判断把f置为了最大值，把s置为了次大值，但是会有num[i]小于
                    // 等于f但是大于s的情况出现，比如用例[1 5 4 5]，s为1，f为5
                    // 但是后续s应该先为4，再为5，所以要再进行一层判断
                    secondMax = nums[i];
                }
            }
            return (firstMax - 1) * (secondMax - 1);
        }
    }
}
